package cn.rkylin.oms.base.refundReasonType.utils.apprhandler.impl;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

import cn.rkylin.apollo.common.util.BeanUtils;
import cn.rkylin.oms.aftersale.sysrefund.dao.ISysRefundDAO;
import cn.rkylin.oms.aftersale.sysrefund.domain.SysRefundSku;
import cn.rkylin.oms.aftersale.sysrefund.vo.SysRefundVO;
import cn.rkylin.oms.aftersale.sysreturn.vo.SysReturnVO;
import cn.rkylin.oms.base.refundReasonType.utils.apprhandler.ApprHandler;
import cn.rkylin.oms.common.consts.YesNoConst;
import cn.rkylin.oms.warehouse.returnStockin.vo.ReturnStockinSkuVO;

/**
 * 类名:HasBrokenHandler <br/>
 * 作用: 退货单已完成且退入数与退货数相符，但有破损（商品品类和数量都相符）. <br/>
 * 创建时间: 2017年11月3日 下午2:43:32 <br/>
 * 
 * @author zhanghao
 * @version v1.0
 */
public class HasBrokenHandler extends ApprHandler {
     private String ruleContent = "退货单已完成且退入数与退货数相符，但库存类型不一致. ";
//    private String ruleContent = "退货单存在退货异常； ";

    /**
     * @see cn.rkylin.oms.base.refundReasonType.utils.apprhandler.ApprHandler#getRuleContent()
     */
    @Override
    protected String getRuleContent() {
        return ruleContent;
    }

    /**
     * @see cn.rkylin.oms.base.refundReasonType.utils.apprhandler.ApprHandler#isValid(cn.rkylin.oms.aftersale.sysrefund.vo.SysRefundVO)
     */
    @Override
    protected boolean isValid(SysRefundVO sysRefundVO) throws Exception {
        boolean returnValue = true;

        ISysRefundDAO sysReturnDAO = BeanUtils.getBean("sysRefundDAO");
        /*
         * 审核该原因退款单时，先判断如果退款单为仅退款，则审核该原因的退款单时不校验该条规则，如果为即退款又退货，再视该条规则是否启用进行校验；<
         * br/>
         * 如果该原因的退款单关联订单所关联的退货单已完成且实际退入数与计划退货数相符（商品品类或数量都相符），但有破损，审核该原因的退款单失败，
         * 要给出失败原因；<br/> 如果不存在上述情况，该条规则校验通过。 <br/>
         * 
         * 变更：如果没有退货诉求，就检查是否有已完成的退货单，如果有就提示，如果没有就过；如果有退货诉求，就检查是否有退货异常；
         * 
         */
        /*if (YesNoConst.NO.equalsIgnoreCase(sysRefundVO.getHasGoodReturn())) {

            List<SysReturnVO> sysReturnVOList = sysRefundVO.getSysReturnVOList();

            for (SysReturnVO sysReturnVO : sysReturnVOList) {
                if ("z".equals(sysReturnVO.getReturnStatus())) {
                    return returnValue = false;
                }
            }
        } else {
            String isReturnDiff = sysReturnDAO.queryReturnDiffByRefundId(sysRefundVO.getRefundId());
            if (YesNoConst.YES.equals(isReturnDiff)) {
                returnValue = false;
            }
        }*/

        List<SysRefundSku> sysRefundSkuList = sysRefundVO.getSysRefundSkuList();
        Set<String> keySet = new HashSet<String>();

        // 获取退款商品的SkuId集合
        for(SysRefundSku sysRefundSku:sysRefundSkuList){
            keySet.add(sysRefundSku.getSkuCode());
        }

        if(YesNoConst.YES.equalsIgnoreCase(sysRefundVO.getHasGoodReturn())){
            // 对于有退货诉求的退款单，如果退款单已完成，且退款商品上存在退货差异，差异为有破损，则给出提示
            List<SysReturnVO> sysReturnVOList = sysRefundVO.getSysReturnVOList();

            for (SysReturnVO sysReturnVO : sysReturnVOList) {
                // 根据退货单获取实际退入商品列表
                if ("z".equals(sysReturnVO.getReturnStatus())) {
//                    List<ReturnStockinSkuVO> sysFactReturnSkuList = returnStockinSkuDAO.selectFactReturnStockinSkuBySourceId(sysReturnVO.getReturnId());
                    List<ReturnStockinSkuVO> sysPlanReturnSkuList = returnStockinSkuDAO.selectPlanReturnStockinSkuBySourceId(sysReturnVO.getReturnId());
                    for(ReturnStockinSkuVO returnStockinSkuVO:sysPlanReturnSkuList){
                        // 如果退入商品有退货差异，且退货差异为有破损，则校验失败
                        if(YesNoConst.YES.equalsIgnoreCase(returnStockinSkuVO.getIsExcept())&&returnStockinSkuVO.getExceptReason().contains("JUNK_ERROR")){
                            if(keySet.contains(returnStockinSkuVO.getSkuCode())){
                                returnValue = false;
                                break;
                            }
                        }
                    }
                }
            }
        }
        return returnValue;
    }

    /**
     * @see cn.rkylin.oms.base.refundReasonType.utils.apprhandler.ApprHandler#getRuleCheckArray()
     */
    private int[] ruleCheckArray = { 7 };

    @Override
    protected int[] getRuleCheckArray() {
        return ruleCheckArray;
    }

    /**
     * getRuleLevel:获取校验规则的级别. <br/>
     *
     * @author zhanghao
     * @return
     */
    @Override
    protected String getRuleLevel() {
        String returnResult = MSG_CONFIRM; // 本条规则总是confirm
        return returnResult;
    }
}
